package cn.cloud9;

public class Case6FishingAndDrying {

    /**
     * http://c.biancheng.net/view/516.html
     * 如果一个渔夫从 2011 年 1 月 1 日开始每三天打一次渔，两天晒一次网
     * 编程实现当输入 2011 1 月 1 日以后的任意一天，输出该渔夫是在打渔还是在晒网。
     * @param args
     */
    public static void main(String[] args) {
        fishingOrDrying(2011, 1, 4);
    }

    /**
     * 判断是否是闰年
     * @param year
     * @return
     */
    private static boolean isLeapYear(int year) {
        return year % 4 == 0 &&  year % 100 != 0 && year % 400 == 0;
    }

    /**
     *
     * @param year
     * @param month
     * @param day
     */
    private static void fishingOrDrying(int year, int month, int day) {
        // 开始日期 2011-01-01
        final int BEGIN_YEAR = 2011;

        // 平年和闰年的天数区分
        final int[] ORDINARY_YEAR = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        final int[] LEAP_YEAR = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

        int sum = 0; // 合计天数

        // 判断年份是闰年还是平年，以计算年份转换的天数
        for (int i = BEGIN_YEAR; i < year; i++) {
            if (isLeapYear(i)) sum += 366;
            else sum += 365;
        }

        // 判断是平年还是润年，以此计算月份转换的天数
        if (isLeapYear(year)) for (int i = 0; i < month - 1; i++) sum += LEAP_YEAR[i];
        else for (int i = 0; i < month - 1; i++) sum += ORDINARY_YEAR[i];

        sum += day;

        int val = sum % 5;

        if ( 4 > val && val > 0 ) {
            // 取模的余数是 1 ~ 3 表示打鱼
            System.out.printf("%d-%d-%d 在打渔\n", year, month, day);
        } else {
            // 否则筛网
            System.out.printf("%d-%d-%d 在晒网\n", year, month, day);
        }
    }

}
